package main

import "fmt"

/*
通道作为参数时，可以限制这个参数通道只能发送或者接收
1.chan<- int是一个只能发送的通道，可以给通道发送但是不能从通道接收；
2.<-chan int是一个只能接收的通道，可以从通道接收但是不能给通道发送。

一般声明通道时，都是双向的，只不过作为参数传递时，可以规定在这个函数内的通道为单向
*/
func counter(out chan<- int) {
	for i := 0; i < 100; i++ {
		out <- i
	}
	close(out)
}

func squarer(out chan<- int, in <-chan int) {
	for i := range in {
		out <- i * i
	}
	close(out)
}
func printer(in <-chan int) {
	for i := range in {
		fmt.Println(i)
	}
}

func main() {
	ch1 := make(chan int)
	ch2 := make(chan int)
	//这里ch1作为一个只能给其发送的通道参数传入
	go counter(ch1)
	//这里ch1是一个只能从其接收的通道，ch2是一个只能给其发送的通道
	go squarer(ch2, ch1)
	printer(ch2)
}
